zk-Rollup と3つのMerkle Tree
すべてのStateは①Rootがチェーン上に保持され、②チェーン外の有効な状態遷移を証明するSNARK Proofを提出することによってのみ変更することができるMerkle Treeに格納されている
https://scrapbox.io/files/629f76375d856d001d63e535.png
正確には、OPREATORはtxのcalldataを集めていると思われ
1. Accounts Merkle Tree
各アカウントは、Accounts Merkle Treeの1つのLeafで表される。
https://scrapbox.io/files/629f791fb3e856001d81558f.png
これは、以下のようにハッシュ化することで算出される。
code:account_leaf
leaf = Hash(pubkey_x, pubkey_y, balance, nonce, token_type)
実際の中身はこんな感じ
code:account_struct
class Account = {
pubkey_x: public key X // (253 bits)
pubkey_y: public key Y //(253 bits)
balance: balance // (128 bits)
nonce: nonce // (32 bits)
token_type: token type // (32 bits)
}
2. Transactions Merkle Tree
各 SNARK に対し、その SNARK が処理したTxをLeafとする Transactions Merkle Treeを構築する
code:tx_structure
class Transaction = {
from: eddsa_pubKey,
fromIndex: integer, // from index is the index of sender's leaf in the accounts tree
to: eddsa_pubKey,
amount: integer,
nonce: integer,
token_type: integer
}
3. Deposit Merkle Tree
L1-L2では資産をdeposit-withdrawする形で移動している
各Depositにより、スマコンにleafが作成される。
スマコンは、nonce、token_type、およびbalanceが正しいかどうかをチェックする。
誰でもこれらのDepositをdeposit_rootを持つDeposit Merkle Treeに集約することができる。
コーディネーターは、次のようにして現在のバランスツリーにこれらを追加することができる。
deposit_treeと同じ深さのempty_nodeが、account_treeの中で空であることを証明する。
このempty_nodeをdeposit_rootと入れ替える。
同じ Merkle Proofを使用して、新しい account_root を計算する。
https://scrapbox.io/files/629f7a80c74e74001d734717.png
https://scrapbox.io/files/629f7a85f7a66d00230fe501.png
Withdrawは、通常の送金と同じように行われる
For withdraw users just have to send their tokens to zero address which is like burning address for our chain.
ユーザーはzero addressに送金するだけで良い。
コレはburning addressのようなもので、トークンはこのアドレスでのみ受け取ることができる。
出金者はzero addressにTxを送信する。
Withdraw()関数は、スマートコントラクト上で呼び出すことができ、以下の処理を行う。
署名の検証
Withdraw Txが存在するか確認する。
プールから指定されたアドレスに資金を転送
参考文献
コレは特定のユースケース向けなのかもしれない